#ifndef JUEGO_H
#define JUEGO_H
#include <cstddef>
#include <SFML/Graphics/Sprite.hpp>
#include <SFML/Audio.hpp>
#include "scene.h"
#include <iostream>
#include <cstdio>
#include "personaje.h"
#include "obstaculo.h"

class Juego : public Scene {


private:
	
	//Vars
	float velocidadEscenario;
	float gravedad;
	float velocidadSalto;
	float nivelTecho;

	float posLinea;//Coordeanada y de la línea central	

	bool colision;


	int mode;


	bool flechaIzq;
	bool flechaIzqHabilitada;
	bool flechaDer;
	bool flechaDerHabilitada;
	
	
	bool mostrarMensaje;

	char aux[256];
	int pulsaciones;


	bool finJuego;
	float tiempoFade;
	float elapsedFade;
	sf::Sprite sprFade;
	sf::Image imgFade;	
	


	//Advertencia
	sf::Sprite sprJoy;

	//Reloj
	sf::Clock reloj;
	float tiempo;

	sf::Vector2f centroVista;//Centro de la vista
	
	//Ventana
	sf::RenderWindow *ventana;	
	sf::View vista;

	
	//Personaje
	Personaje *personaje;


	//Vidas
	sf::Sprite vidas[15];//Vector con los sprites de vida

	//Obstáculos
	Obstaculo *obstaculos[6];//Vector con los obstáculos
	float tiempoEntreObstaculos;//Tiempo mínimo que debe haber entre la aparación de cada obstáculo
	float elapsedObstaculos;//Tiempo transcurrido
	
	//Genera obstáculos aleatoriamente
	void AparecerObstaculos();

	//Fondo y línea
	sf::Image imgLinea;
	sf::Image imgFondo;
	sf::Sprite sprLinea;
	sf::Sprite sprFondo;


	//String
	sf::String strPulsaciones;
	sf::String strReloj;
	sf::String strLimiteBajo;
	sf::String strLimiteAlto; 
	sf::String strMensaje;

	
	//Sonido
	sf::SoundBuffer buffLatidos;
	sf::SoundBuffer buffPeep;
	sf::SoundBuffer buffDead;
	sf::Sound sndLatidos;
	sf::Sound sndPeep;
	sf::Sound sndDead;



public:

	//Constructor
	Juego(int mode);


	//Hereda de Scene
	void Init();
	void ProcessEvent(const sf::Event &e);
	void Render(sf::RenderWindow &w);
	void Update(const float &dt);
	void CleanUp();
	void DetectarColisiones();
	
	//Aumenta o disminuye las pulsaciones
	void VariarPulsaciones(int p);

	//Calcula la velocidad del escenario según las pulsaciones
	void CalcularVelocidadEscenario();	

	//Chequea las condiciones de fin de juego
	bool CheckFinJuego();
	
	//controla si debe mostrar la advertencia
	void ControlarLimites();

};
#endif
